package java_thinking.unit_10._10_6;

import java_thinking.unit_10._10_4.Contents;

/**
 * @Description :   匿名内部类
 *                  Parcel7是Parcel7b的简化写法
 * @author: cww
 * @DateTime: 2019-03-10 15:23
 */

class Parcel7 {

    public Contents contence(final int b){
        /**
         * 1.在方法内部直接返回一个contents的对象
         * 2.如果内部类要使用一个外部定义的对象，那么编译器就要求的这个对象要是final的，不然编译器会报错！！！
         *  (用简单的话来说为什么是final:因为
         *      1.匿名内部类是一个典型的闭包结构
         *      2.匿名内部类访问外围自由变量的时候，其实是在编译的时候隐式的将外围自由变量拷贝了一份到内部类中
         *      3.但是为了保证内部类和外围自由变量数据同步，java一刀切，既然内外不能同步将该自由变量定义为final，也就不让修改
         *      4.还有一个原因是为什么要用匿名内部类，就是在使用后立马就销毁的对象，因为我们只是用一下，就不用了，可能这时候直接规定内部类和外围变量是final的
         *      在实现机制上会更加简单，省去同步的资源)
         *      从编译角度：反编译一下生成的class就知道了，匿名类编译的时候生成了相应的字段来capture访问的局部变量，为了和局部变量保持一致性，内部类不能修改这个变量，所以需要final
         *  参考：https://www.zhihu.com/question/21395848
         */
        return new Contents() {
            private int i = b;
            @Override
            public int value() {
                return i;
            }
        };
    }
}


class Parcel7b{
    class MyContents implements Contents{
        private int i = 11;
        @Override
        public int value() {
            return i;
        }
    }
    public Contents contents(){
        return new MyContents();
    }

    public static void main(String[] args) {
        Parcel7b b = new Parcel7b();
        Contents contents = b.contents();
        System.out.println(contents.value());
    }
}
